#!/bin/bash

# PowerBank系统 - Nacos配置导入脚本
# 版本: 1.0.0
# 日期: 2025-01-07

set -e

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 配置变量
NACOS_HOST="localhost:8848"
NAMESPACE_DEV="powerbank-dev"
NAMESPACE_TEST="powerbank-test"
NAMESPACE_PROD="powerbank-prod"
GROUP="DEFAULT_GROUP"
CONFIG_DIR="./nacos-configs"

echo -e "${GREEN}=== PowerBank Nacos 配置导入脚本 ===${NC}"

# 函数：打印信息
print_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 函数：检查Nacos连接
check_nacos_connection() {
    print_info "检查Nacos连接..."
    
    if ! curl -s "http://${NACOS_HOST}/nacos/v1/cs/configs" > /dev/null; then
        print_error "无法连接到Nacos服务器: http://${NACOS_HOST}"
        print_error "请确保Nacos服务已启动"
        exit 1
    fi
    
    print_info "Nacos连接正常"
}

# 函数：导入配置文件
import_config() {
    local file_path=$1
    local data_id=$2
    local namespace=$3
    local group=$4
    
    if [ ! -f "$file_path" ]; then
        print_warning "配置文件不存在: $file_path"
        return 1
    fi
    
    print_info "导入配置: $data_id (namespace: $namespace)"
    
    local content=$(cat "$file_path")
    local response=$(curl -s -X POST "http://${NACOS_HOST}/nacos/v1/cs/configs" \
        -d "dataId=${data_id}" \
        -d "group=${group}" \
        -d "tenant=${namespace}" \
        -d "content=${content}")
    
    if [ "$response" = "true" ]; then
        print_info "✓ 配置导入成功: $data_id"
        return 0
    else
        print_error "✗ 配置导入失败: $data_id"
        return 1
    fi
}

# 函数：导入开发环境配置
import_dev_configs() {
    print_info "导入开发环境配置..."
    
    # 公共配置
    import_config "$CONFIG_DIR/common-config.yml" "common-config.yml" "$NAMESPACE_DEV" "$GROUP"
    
    # 各微服务配置
    import_config "$CONFIG_DIR/api-gateway-dev.yml" "api-gateway.yml" "$NAMESPACE_DEV" "$GROUP"
    import_config "$CONFIG_DIR/user-center-dev.yml" "user-center.yml" "$NAMESPACE_DEV" "$GROUP"
    import_config "$CONFIG_DIR/payment-center-dev.yml" "payment-center.yml" "$NAMESPACE_DEV" "$GROUP"
    import_config "$CONFIG_DIR/order-center-dev.yml" "order-center.yml" "$NAMESPACE_DEV" "$GROUP"
    import_config "$CONFIG_DIR/device-center-dev.yml" "device-center.yml" "$NAMESPACE_DEV" "$GROUP"
    import_config "$CONFIG_DIR/finance-center-dev.yml" "finance-center.yml" "$NAMESPACE_DEV" "$GROUP"
    import_config "$CONFIG_DIR/admin-system-dev.yml" "admin-system.yml" "$NAMESPACE_DEV" "$GROUP"
}

# 函数：创建测试环境配置
create_test_configs() {
    print_info "创建测试环境配置..."
    
    # 复制开发环境配置到测试环境，并修改端口和数据库
    for config_file in "$CONFIG_DIR"/*-dev.yml; do
        if [ -f "$config_file" ]; then
            local base_name=$(basename "$config_file" -dev.yml)
            local test_config="${CONFIG_DIR}/${base_name}-test.yml"
            
            # 复制并修改配置
            cp "$config_file" "$test_config"
            
            # 修改端口（开发环境80xx -> 测试环境81xx）
            sed -i.bak 's/port: 800/port: 801/g' "$test_config"
            # 修改数据库（_dev -> _test）
            sed -i.bak 's/_dev/_test/g' "$test_config"
            sed -i.bak 's/powerbank-dev/powerbank-test/g' "$test_config"
            
            # 删除备份文件
            rm -f "${test_config}.bak"
            
            # 导入配置
            local data_id="${base_name}.yml"
            import_config "$test_config" "$data_id" "$NAMESPACE_TEST" "$GROUP"
        fi
    done
    
    # 公共配置
    import_config "$CONFIG_DIR/common-config.yml" "common-config.yml" "$NAMESPACE_TEST" "$GROUP"
}

# 函数：创建生产环境配置
create_prod_configs() {
    print_info "创建生产环境配置..."
    
    # 复制开发环境配置到生产环境，并修改端口和数据库
    for config_file in "$CONFIG_DIR"/*-dev.yml; do
        if [ -f "$config_file" ]; then
            local base_name=$(basename "$config_file" -dev.yml)
            local prod_config="${CONFIG_DIR}/${base_name}-prod.yml"
            
            # 复制并修改配置
            cp "$config_file" "$prod_config"
            
            # 修改端口（开发环境80xx -> 生产环境82xx）
            sed -i.bak 's/port: 800/port: 802/g' "$prod_config"
            # 修改数据库（_dev -> _prod）
            sed -i.bak 's/_dev/_prod/g' "$prod_config"
            sed -i.bak 's/powerbank-dev/powerbank-prod/g' "$prod_config"
            # 修改日志级别
            sed -i.bak 's/DEBUG/INFO/g' "$prod_config"
            
            # 删除备份文件
            rm -f "${prod_config}.bak"
            
            # 导入配置
            local data_id="${base_name}.yml"
            import_config "$prod_config" "$data_id" "$NAMESPACE_PROD" "$GROUP"
        fi
    done
    
    # 公共配置
    import_config "$CONFIG_DIR/common-config.yml" "common-config.yml" "$NAMESPACE_PROD" "$GROUP"
}

# 函数：验证配置导入
verify_configs() {
    print_info "验证配置导入..."
    
    local namespaces=("$NAMESPACE_DEV" "$NAMESPACE_TEST" "$NAMESPACE_PROD")
    
    for namespace in "${namespaces[@]}"; do
        print_info "检查命名空间: $namespace"
        
        local configs=$(curl -s "http://${NACOS_HOST}/nacos/v1/cs/configs?tenant=${namespace}&pageNo=1&pageSize=100" | jq -r '.pageItems[].dataId' 2>/dev/null || echo "")
        
        if [ -n "$configs" ]; then
            print_info "命名空间 $namespace 中的配置:"
            echo "$configs" | while read -r config; do
                if [ -n "$config" ]; then
                    echo "  - $config"
                fi
            done
        else
            print_warning "命名空间 $namespace 中没有配置或jq命令不可用"
        fi
        echo
    done
}

# 函数：清理临时文件
cleanup() {
    print_info "清理临时文件..."
    
    # 删除生成的测试和生产配置文件
    rm -f "$CONFIG_DIR"/*-test.yml
    rm -f "$CONFIG_DIR"/*-prod.yml
    
    print_info "清理完成"
}

# 主函数
main() {
    echo -e "${GREEN}开始导入Nacos配置...${NC}"
    
    # 检查配置目录
    if [ ! -d "$CONFIG_DIR" ]; then
        print_error "配置目录不存在: $CONFIG_DIR"
        exit 1
    fi
    
    # 检查Nacos连接
    check_nacos_connection
    
    # 导入配置
    import_dev_configs
    create_test_configs
    create_prod_configs
    
    # 验证配置
    verify_configs
    
    # 清理临时文件
    cleanup
    
    echo -e "${GREEN}=== Nacos配置导入完成 ===${NC}"
    echo -e "${GREEN}开发环境: http://${NACOS_HOST}/nacos (命名空间: ${NAMESPACE_DEV})${NC}"
    echo -e "${GREEN}测试环境: http://${NACOS_HOST}/nacos (命名空间: ${NAMESPACE_TEST})${NC}"
    echo -e "${GREEN}生产环境: http://${NACOS_HOST}/nacos (命名空间: ${NAMESPACE_PROD})${NC}"
}

# 执行主函数
main "$@"